package com.example.service.impl;

import com.example.entity.dto.LifeTool.RelationGraph;
import com.example.mapper.RelationGraphMapper;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;

import static com.example.utils.Const.REDIS_KEY_PREFIX;

/**
 * 关系图缓存服务类，负责将数据库中的关系图加载到Redis并提供查询接口
 *
 * @auth shanyue
 * @date 2025年07月07日20:13
 */
@Service
public class RelationGraphCacheService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private RelationGraphMapper relationGraphMapper;

    /*
     * redis哈希操作对象，用于操作嵌套结构的
     * key:fromRelation,例如我
     * field: toRelation例如爸爸
     * value: resultRelation,例如父亲
     * */
    private HashOperations<String, String, String> hashOperations;


    /**
     * 初始化完成后自动执行，将Redis Hash 操作初始化并加载缓存
     */
    @PostConstruct
    public void init() {
        hashOperations = stringRedisTemplate.opsForHash();
        loadAllRelationGraphToRedis();
    }

    /**
     * 从数据库中加载所有关系图数据，并存入redis哈希结构中
     */
    public void loadAllRelationGraphToRedis() {
        List<RelationGraph> list = relationGraphMapper.selectList(null);
        for (RelationGraph relationGraph : list) {
            String redisKey = REDIS_KEY_PREFIX + relationGraph.getFromRelation();
            hashOperations.put(redisKey, relationGraph.getToRelation(), relationGraph.getResultRelation());
        }
    }

    /**
     * 从redis缓存中获取两个关系之间的推导结果
     *
     * @param fromRelation 当前关系
     * @param toRelation   下一步关系
     * @return 最终结果
     */
    public String getResultRelation(String fromRelation, String toRelation) {
        String redisKey = REDIS_KEY_PREFIX + fromRelation;
        return hashOperations.get(redisKey, toRelation);
    }

    /**
     * 清空redis缓存并重新加载数据(用于刷新数据或热更新)
     */
    public void refreshCache() {
        // 获取所有以 "relation:" 为前缀的 Redis key
        Set<String> keys = stringRedisTemplate.keys(REDIS_KEY_PREFIX + "*");

        // 批量删除这些 key（如果存在）
        if (keys != null && !keys.isEmpty()) {
            stringRedisTemplate.delete(keys);
        }

        // 从数据库重新加载所有关系图数据到 Redis
        loadAllRelationGraphToRedis();
    }

    /**
     * 获取redis的哈希操作对象，供给外部使用
     *
     * @return redis中的Hash操作对象
     */
    public HashOperations<String, String, String> getHashOperations() {
        return hashOperations;
    }

}
